Skip to content

feat(desktop): make thread reply notifications traceable - #3754

Open
daveh-beep wants to merge 4 commits into
block:mainfrom
daveh-beep:dh/thread-notification-traceability
Open

feat(desktop): make thread reply notifications traceable#3754
daveh-beep wants to merge 4 commits into
block:mainfrom
daveh-beep:dh/thread-notification-traceability

Conversation

@daveh-beep

Copy link
Copy Markdown
Contributor

Summary

  • distinguish thread-only channel unreads from mentions with a thread glyph badge
  • promote Inbox when it has unread items so its hierarchy matches its payoff
  • make unseen thread replies traceable in-channel with parent accents, high-contrast counts, and a jump/open pill
  • include sender context in desktop thread-reply notifications

Problem

A reply in a followed/participated thread currently makes the channel row bold with a solid numeric badge. Opening that channel produces no visible new message because thread replies are intentionally excluded from the top-level unread divider. The only trace is muted (N new) metadata under the parent message, which may be off-screen.

This creates a signal-strength inversion: the strongest signal points at a surface with no visible payoff, while Inbox—the surface that can resolve the notification—gets the weakest signal.

Design rationale and before/after loop

https://blockcell.sqprod.co/sites/buzz-design-reel/

The reel uses Buzz's dark-theme HSL tokens, Inter Variable font, real sidebar/button dimensions, badge classes, unread divider, thread-summary treatment, and unread pill styling. It includes realistic states for channel messages, thread-only replies, mentions, DMs, muted channels, and read channels.

Test plan

  • just desktop-check
  • just desktop-test (3824 passed)
  • pre-push suite (desktop, desktop Tauri, mobile, Rust) passed before upload
  • E2E expectations updated but Playwright suite not run locally

Review status

Draft for design and implementation review. Please treat the Blockcell reel as rationale/fodder, not a final spec.

Signed-off-by: David Hamilton <daveh@squareup.com>
…n-traceability

* origin/main:
  fix(desktop): remove remaining Projects panel fills (block#3742)
  feat(mobile): desktop-parity emoji and thread experience (block#3485)
  desktop: restore direct community member adds (block#3634)
  fix(desktop): explain open agent access (block#2561)
  fix(cli): resolve agents from owner records (block#3178)
  fix(desktop): remove Projects overview card fills (block#3416)
  feat(replica): portable heartbeat-token fence with snapshot-local reader routing (block#3268)
  fix(git): channel binding tooling + author remediation for unbound repos (block#3626)
  feat: configure S3 URL addressing style (block#3400)
  feat: add first-class OpenRouter provider support (block#1975)
  feat(agent,acp): wire provider total_tokens through NIP-AM publish chain (block#3593)
  chore(release): release Buzz Desktop version 0.5.2 (block#3624)
  docs: add Linux rendering troubleshooting guide (block#3573)
  fix(desktop): discover bun-installed agent CLIs in ~/.bun/bin (block#3343)
  feat(tracing): correlate trace IDs in relay logs (block#3608)
  chore(ci): bump Linux AppImage build container to ubuntu:24.04 (block#3602)
  feat(cli): mirror Desktop mention delivery (block#3330)

Signed-off-by: David Hamilton <daveh@squareup.com>
Signed-off-by: David Hamilton <daveh@squareup.com>
daveh-beep added a commit to daveh-beep/buzz that referenced this pull request Jul 30, 2026
Signed-off-by: David Hamilton <daveh@squareup.com>
daveh-beep added a commit to daveh-beep/buzz that referenced this pull request Jul 30, 2026
@daveh-beep

Copy link
Copy Markdown
Contributor Author

🤖 ## Proposed design — rendered by this PR's code

These are not mocks. Each image is generated by desktop/tests/e2e/thread-unread-screenshots.spec.ts (added in this PR) against the app as built from this branch, so the pictures regenerate instead of drifting when the design iterates:

pnpm build:e2e && pnpm exec playwright test --project=smoke tests/e2e/thread-unread-screenshots.spec.ts

1. Sidebar signal grammar

One state per meaning, all in frame: solid count = mention/DM (#random, alice-tyler), outlined thread count = the unread lives in a thread (#engineering), dot = ambient unread (#agents), and Inbox carries a solid count matching its payoff.

01-sidebar-signal-grammar

Sidebar detail at actual size:

02-sidebar-signal-grammar-detail

2. Channel wayfinding

Following the signal into the channel no longer dead-ends: the parent row carries a continuous accent spanning message + thread summary, the summary shows a legible "3 new" pill (accessible label includes the unread count), and the floating "3 new replies in threads" pill offers the direct next step.

03-channel-thread-cues

3. Destination

Clicking the pill jumps to the parent and opens the thread panel with the New divider at the exact unread boundary — notification → exact reply, zero scanning.

04-thread-destination


Interactive before/after rationale (real captures of main vs this branch): https://blockcell.sqprod.co/sites/buzz-design-reel/

@daveh-beep
daveh-beep marked this pull request as ready for review July 30, 2026 17:59
@daveh-beep
daveh-beep requested a review from a team as a code owner July 30, 2026 17:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant